package sifeap.dal.ejb.solicitudesauxilio;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import sifeap.dal.ejb.AbstractFacade;
import sifeap.entities.solicitudesauxilio.SolicitudAuxilio;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.exception.SifeapException;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="SolicitudAuxilioDAL")
public class SolicitudAuxilioDAL extends AbstractFacade<SolicitudAuxilio> implements SolicitudAuxilioDALLocal {

	@PersistenceContext(unitName = "sifeapPU")
	private EntityManager em;
	
    /**
     * Default constructor. 
     */
    public SolicitudAuxilioDAL() {
    	super(SolicitudAuxilio.class);
    }

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	@Override
	public List<SolicitudAuxilio> buscarSolicitudes(SolicitudAuxilioVO solicitudAuxilioVo, boolean misSolicitudes) {
		List<SolicitudAuxilio> listaSolicitudes;
		String sqlString = null;
		
		if (misSolicitudes) {
			sqlString = this.obtenerConsulta("misSolicitudesAuxilio");
		} else {
			sqlString = this.obtenerConsulta("consultarSolicitudesAuxilio");
		}

		//Arma el query
		if (solicitudAuxilioVo != null) {
			if (solicitudAuxilioVo.getSolicitudAuxilio() != null) {
				if (solicitudAuxilioVo.getSolicitudAuxilio().getVincedula() != null 
						&& solicitudAuxilioVo.getSolicitudAuxilio().getVincedula().trim().length() > 0) {
					//Tiene cedula
					sqlString = sqlString.concat(" and solaux.vincedula = '".concat(solicitudAuxilioVo.getSolicitudAuxilio().getVincedula()).concat("' "));
				}
				
				if (solicitudAuxilioVo.getSolicitudAuxilio().getEstadosauxilio() != null
						&& solicitudAuxilioVo.getSolicitudAuxilio().getEstadosauxilio().getIdEstadoAuxilio() != null
						&& solicitudAuxilioVo.getSolicitudAuxilio().getEstadosauxilio().getIdEstadoAuxilio() > 0) {
					//Tiene estado de solicitud
					sqlString = sqlString.concat(" and solaux.idestadoauxilio = ".concat(String.valueOf(solicitudAuxilioVo.getSolicitudAuxilio().getEstadosauxilio().getIdEstadoAuxilio())));
				}
			}
			DateFormat formatter = null;
			if (solicitudAuxilioVo.getFechaInicio() != null) {
				formatter = new SimpleDateFormat("yyyy-MM-dd");
				sqlString = sqlString.concat(" and solaux.fechasolicitud >= '".concat(formatter.format(solicitudAuxilioVo.getFechaInicio())).concat(" 00:00:00'"));
			}
			
			if (solicitudAuxilioVo.getFechaFin() != null) {
				if (formatter == null) {
					formatter = new SimpleDateFormat("yyyy-MM-dd");
				}
				sqlString = sqlString.concat(" and solaux.fechasolicitud <= '".concat(formatter.format(solicitudAuxilioVo.getFechaFin())).concat(" 23:59:59'"));
			}
		}
		
		sqlString = sqlString.concat(" order by solaux.fechasolicitud desc");
		
		Query query = em.createNativeQuery(sqlString, SolicitudAuxilio.class);
		query.setHint("javax.persistence.cache.storeMode", "REFRESH");
		
		listaSolicitudes = query.getResultList();
		
		return listaSolicitudes;
	}
	
	@Override
	public boolean cambiarEstadoSolicitud(long idSolicitudAuxilio, Long estadoAuxilio, String comentario) throws SifeapException {
		boolean resultado = false;
		
		try {
			Query query = em.createNamedQuery("cambiarEstadoSolicitudAuxilio");
			query.setParameter(1, estadoAuxilio);
			query.setParameter(2, comentario);
			query.setParameter(3, idSolicitudAuxilio);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}

	@Override
	public boolean asociarSoportesAuxilio(long idSolicitudAuxilio, Long idSoporte) throws SifeapException {
		boolean resultado = false;
		
		try {
			Query query = em.createNamedQuery("insertarSoportesAuxilio");
			query.setParameter(1, idSolicitudAuxilio);
			query.setParameter(2, idSoporte);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}
	
	@Override
	public boolean eliminarRegistrosAsociados(long idSolicitudAuxilio) throws SifeapException {
		boolean resultado = false;
		
		try {
			//Elimina registros de SOPORTESAUXILIO
			Query query = em.createNamedQuery("eliminarSoportesAuxilio");
			query.setParameter(1, idSolicitudAuxilio);
			query.executeUpdate();
			
			resultado = true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return resultado;
	}
	
	@Override
	public SolicitudAuxilio buscarUltimoAuxilioAprobado(String cedula, Long idTipoAuxilio) throws Exception {
		SolicitudAuxilio solicitudAuxilio = null;
		try {
			final javax.persistence.Query query = em.createNamedQuery("ultimaSolicitudAprobada", SolicitudAuxilio.class);
			query.setParameter(1, cedula);
			query.setParameter(2, idTipoAuxilio);
			solicitudAuxilio = (SolicitudAuxilio) query.getSingleResult();
		} catch (Exception e) {
			throw new Exception(e);
		}
		return solicitudAuxilio;
    }
}